package br.com.dallasmotopecas.compra.produto.managerbean;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

import br.com.dallasmotopecas.comum.fabricante.vo.FabricanteVo;
import br.com.dallasmotopecas.comum.produto.controller.ProdutoController;
import br.com.dallasmotopecas.comum.produto.controller.ProdutoGiroController;
import br.com.dallasmotopecas.comum.produto.vo.ProdutoGiroDetalheVo;
import br.com.dallasmotopecas.comum.produto.vo.ProdutoGiroVo;
import br.com.dallasmotopecas.comum.produto.vo.ProdutoVo;
import br.com.dallasmotopecas.util.exception.CampoObrigatorioException;
import br.com.dallasmotopecas.util.exception.ClasseNaoEncontradaException;
import br.com.dallasmotopecas.util.exception.ConexaoException;
import br.com.dallasmotopecas.util.exception.DirecionamentoPaginaException;
import br.com.dallasmotopecas.util.exception.InserirObjetoException;
import br.com.dallasmotopecas.util.exception.ListarObjetoException;
import br.com.dallasmotopecas.util.managerbean.AbstractManagerBean;

@ManagedBean(name="managerSemGiroBean")
@ViewScoped
public class ManagerSemGiroBean extends AbstractManagerBean implements Serializable
{
	private static final long serialVersionUID = 1L;
	private List<ProdutoVo> listaProdutoSemGiro;
	private List<ProdutoVo> listaProdutoSemGiroGravar;
	private List<FabricanteVo> listaFabricantes;
	private ProdutoVo produtoVo;
	private FabricanteVo fabricanteVo;
	
	@PostConstruct
	private void inicializar()
	{
		try
		{
			if (!isUsuarioLogado())
			{
				redirecionarPagina("/Index.jsf");
				return;
			}
			processaPermissaoUsuario(getUsuarioLogado());
		}
		catch(DirecionamentoPaginaException e)
		{
			processarMensagem(MENSAGEM_FATAL, e.getMessage());
		}
	}
	
	@PreDestroy
	public void destroy()
	{
		if (getListaProdutoSemGiro() != null)
		{
			getListaProdutoSemGiro().clear();
			setListaProdutoSemGiro(null);
		}
		
		if (getListaProdutoSemGiroGravar() != null)
		{
			getListaProdutoSemGiroGravar().clear();
			setListaProdutoSemGiroGravar(null);
		}
		
		if (getListaFabricantes() != null)
		{
			getListaFabricantes().clear();
			setListaFabricantes(null);
		}
		
		setProdutoVo(null);
	}

	public List<ProdutoVo> getListaProdutoSemGiro()
	{
		if (listaProdutoSemGiro == null) listaProdutoSemGiro = new ArrayList<ProdutoVo>();
		
		return listaProdutoSemGiro;
	}

	public void setListaProdutoSemGiro(List<ProdutoVo> listaProdutoSemGiro)
	{
		this.listaProdutoSemGiro = listaProdutoSemGiro;
	}

	public List<FabricanteVo> getListaFabricantes()
	{
		if (listaFabricantes == null) listaFabricantes = new ArrayList<FabricanteVo>();
		
		return listaFabricantes;
	}

	public void setListaFabricantes(List<FabricanteVo> listaFabricantes)
	{
		this.listaFabricantes = listaFabricantes;
	}

	public ProdutoVo getProdutoVo()
	{
		if (produtoVo == null) produtoVo = new ProdutoVo();
		
		return produtoVo;
	}

	public void setProdutoVo(ProdutoVo produtoVo)
	{
		this.produtoVo = produtoVo;
	}
	
	public FabricanteVo getFabricanteVo()
	{
		if (fabricanteVo == null) fabricanteVo = new FabricanteVo();
		
		return fabricanteVo;
	}

	public void setFabricanteVo(FabricanteVo fabricanteVo)
	{
		this.fabricanteVo = fabricanteVo;
	}

	public List<ProdutoVo> getListaProdutoSemGiroGravar()
	{
		if (listaProdutoSemGiroGravar == null) listaProdutoSemGiroGravar = new ArrayList<ProdutoVo>();
		
		return listaProdutoSemGiroGravar;
	}

	public void setListaProdutoSemGiroGravar(
			List<ProdutoVo> listaProdutoSemGiroGravar)
	{
		this.listaProdutoSemGiroGravar = listaProdutoSemGiroGravar;
	}

	public void carregarFiltro()
	{
		setProdutoVo(new ProdutoVo());
		abrirModal("diagFiltro");
	}

	public void carregarListaProdustos()
	{
		ProdutoController produtoController = null;
		HashSet<FabricanteVo> listaFabricante = null;
		try
		{
			limparDados();
			produtoController = new ProdutoController(getContexto());
			produtoController.processarListaProdutoSemGiro(getListaProdutoSemGiroGravar(), getProdutoVo());
			getListaProdutoSemGiro().addAll(getListaProdutoSemGiroGravar());
			listaFabricante = new HashSet<FabricanteVo>();
			
			for (int i = 0; i < getListaProdutoSemGiro().size(); i++)
				listaFabricante.add(getListaProdutoSemGiro().get(i).getFabricanteVo());
			
			getListaFabricantes().addAll(listaFabricante);
			Collections.sort(getListaFabricantes());
			getListaFabricantes().add(0, new FabricanteVo(0, 0, "Todos"));
			
			fecharModalSemMensagem("diagFiltro");
		}
		catch(ConexaoException e)
		{
			e.printStackTrace();
			processarMensagem(MENSAGEM_FATAL, e.getMessage());
		}
		catch (ClasseNaoEncontradaException e)
		{
			e.printStackTrace();
			processarMensagem(MENSAGEM_FATAL, e.getMessage());
		}
		catch (ListarObjetoException e)
		{
			e.printStackTrace();
			processarMensagem(MENSAGEM_FATAL, e.getMessage());
		}
		finally
		{
			if (produtoController != null)
			{
				produtoController.close();
				produtoController = null;
			}
			
			listaFabricante = null;
		}
	}
	
	public void carregarProdutoFabricante()
	{
		getListaProdutoSemGiro().clear();
		
		if (getFabricanteVo().getId() == 0)
			getListaProdutoSemGiro().addAll(getListaProdutoSemGiroGravar());
		else
		{
			for (int i = 0; i < getListaProdutoSemGiroGravar().size(); i++)
			{
				if (getListaProdutoSemGiroGravar().get(i).getFabricanteVo().getId() == getFabricanteVo().getId())
					getListaProdutoSemGiro().add(getListaProdutoSemGiroGravar().get(i));
			}
		}
		
		Collections.sort(getListaProdutoSemGiro());
	}
	
	public void gravarProdutos()
	{
		ProdutoGiroVo produtoGiroVo = null;
		ProdutoGiroDetalheVo produtoGiroDetalheVo = null;
		ProdutoGiroController produtoGiroController = null;
		try
		{
			
			produtoGiroVo = new ProdutoGiroVo();
			produtoGiroVo.setTipoGiro("S");
			produtoGiroVo.getUsuarioVo().setId(getUsuarioLogado().getId());
			produtoGiroVo.setQuantidadeDiaGiro(getProdutoVo().getQuantidadeDiaGiro());
			produtoGiroVo.setQuantidadeDiaReposicao(getProdutoVo().getQuantidadeDiaReposicao());
			
			for (int i = 0; i < getListaProdutoSemGiroGravar().size(); i++)
			{
				produtoGiroDetalheVo = new ProdutoGiroDetalheVo();
				produtoGiroDetalheVo.setIdCodigoEptus(getListaProdutoSemGiroGravar().get(i).getIdCodigoEptus());
				produtoGiroDetalheVo.setIdEmpresaEptus(getListaProdutoSemGiroGravar().get(i).getIdEmpresaEptus());
				produtoGiroDetalheVo.setDescricao(getListaProdutoSemGiroGravar().get(i).getDescricao());
				produtoGiroDetalheVo.getFabricanteVo().setId(getListaProdutoSemGiroGravar().get(i).getFabricanteVo().getId());
				produtoGiroDetalheVo.setQuantidadeDisponivel(getListaProdutoSemGiroGravar().get(i).getQuantidade());
				produtoGiroDetalheVo.setQuantidadeReposta(getListaProdutoSemGiroGravar().get(i).getQuantidadeReposta());
				produtoGiroDetalheVo.setValor(getListaProdutoSemGiroGravar().get(i).getValor());
				
				produtoGiroVo.getListaProdutosGiro().add(produtoGiroDetalheVo);
			}
			
			produtoGiroController = new ProdutoGiroController(getContexto());
			produtoGiroController.inserir(produtoGiroVo);
			
			limparDados();
			processarMensagem(MENSAGEM_INFORMATIVA, "Lista Gravada com Sucesso");
		}
		catch(InserirObjetoException e)
		{
			e.printStackTrace();
			processarMensagem(MENSAGEM_FATAL, e.getMessage());
		}
		catch (ClasseNaoEncontradaException e)
		{
			e.printStackTrace();
			processarMensagem(MENSAGEM_FATAL, e.getMessage());
		}
		catch (ConexaoException e)
		{
			e.printStackTrace();
			processarMensagem(MENSAGEM_FATAL, e.getMessage());
		}
		catch (CampoObrigatorioException e)
		{
			processarMensagem(MENSAGEM_INFORMATIVA, e.getMessage());
		}
		finally
		{
			if (produtoGiroController != null)
			{
				produtoGiroController.close();
				produtoGiroController = null;
			}
		}
	}
	
	private void limparDados()
	{
		if (getListaProdutoSemGiro() != null)
		{
			getListaProdutoSemGiro().clear();
			setListaProdutoSemGiro(new ArrayList<ProdutoVo>());
		}
		
		if (getListaProdutoSemGiroGravar() != null)
		{
			getListaProdutoSemGiroGravar().clear();
			setListaProdutoSemGiroGravar(new ArrayList<ProdutoVo>());
		}
		
		if (getListaFabricantes() != null)
		{
			getListaFabricantes().clear();
			setListaFabricantes(new ArrayList<FabricanteVo>());
		}
		
		setFabricanteVo(new FabricanteVo());
	}
	
	public void sair()
	{
		try
		{
			redirecionarPagina("/view/compra/Home.jsf");
		}
		catch (DirecionamentoPaginaException e)
		{
			e.printStackTrace();
		}
	}
}
